package com.itany.mybatis;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itany.mybatis.dao.HeroDao;
import com.itany.mybatis.dao.HeroTypeDao;
import com.itany.mybatis.entity.Hero;
import com.itany.mybatis.entity.HeroType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

/**
 * Description: 类的描述
 * Author: liudaolin@itany.com
 * Date: 2021/07/19 16:04
 * Version: 1.0 版本信息
 */
public class Test02 {
    /**
     * SqlSession 是核心, 又称之为 持久化管理器
     */
    private SqlSession session;

    // 初始化 mybatis
    @Before
    public void before() {
        // 1.创建 SqlSessionFactory 构建器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 2.加载 mybatis-config 文件, 创建 SqlSessionFactory
        SqlSessionFactory factory = builder.build(Test01.class
                .getClassLoader()
                .getResourceAsStream("mybatis-config.xml"));
        /*
        3.获取 SqlSession, 开启会话(默认开启事务, 不自动提交事务, 且不手动提交事务时,
        默认结束时会执行事务的回滚), 可以传入参数, 默认为 false, 不自动提交事务; true, 自动提交事务。
         */
        session = factory.openSession();
        System.out.println("start");
    }

    @After
    public void after() {
        // 关闭会话
        if(null != session){
            session.close();
        }
        System.out.println("end");
    }

    @Test
    public void h1() {
        HeroDao heroDao = session.getMapper(HeroDao.class);
        List<Hero> list = heroDao.selectAll1();
        list.forEach(System.out::println);
    }
    @Test
    public void h2() {
        HeroDao heroDao = session.getMapper(HeroDao.class);
        List<Hero> list = heroDao.selectAll2();
        list.forEach(System.out::println);
    }
    @Test
    public void h3() {
        HeroDao heroDao = session.getMapper(HeroDao.class);
        List<Hero> list = heroDao.selectAll3();
        list.forEach(System.out::println);
    }
    @Test
    public void h4() {
        HeroDao heroDao = session.getMapper(HeroDao.class);
        List<Hero> list = heroDao.selectAll4();
        list.forEach(System.out::println);
    }

    @Test
    public void h5() {
        HeroTypeDao mapper = session.getMapper(HeroTypeDao.class);
        List<HeroType> list = mapper.selectAll2();
        list.forEach(ht -> {
            System.out.println(ht);
            System.out.println("\tHeroes:" + ht.getHeroes());
        });
    }

    @Test
    public void h6() {
        HeroTypeDao mapper = session.getMapper(HeroTypeDao.class);
        List<HeroType> list = mapper.selectAll3();
        list.forEach(ht -> {
            System.out.println(ht);
            System.out.println("\tHeroes:" + ht.getHeroes());
        });
    }

    @Test
    public void h7() {
        HeroTypeDao mapper = session.getMapper(HeroTypeDao.class);
        List<HeroType> list = mapper.selectAll4();
        list.forEach(ht -> {
            System.out.println(ht);
            System.out.println("\tHeroes:" + ht.getHeroes());
        });
    }


    @Test
    public void h8() {
        // controller 调用分页功能
        int pageNum = 1;
        int pageSize = 2;
        PageInfo<Hero> pageInfo = findByPage(pageNum, pageSize);

        System.out.println("当前页码:" + pageInfo.getPageNum());
        System.out.println("上一页:" + pageInfo.getPrePage());
        System.out.println("下一页:" + pageInfo.getNextPage());
        System.out.println("总页数:" + pageInfo.getPages());
        System.out.println("总数据量:" + pageInfo.getTotal());

        // 分页按钮 导航
        int[] navigatepageNums = pageInfo.getNavigatepageNums();
        System.out.println(Arrays.toString(navigatepageNums));

        // 当前页数据
        List<Hero> list = pageInfo.getList();
        list.forEach(System.out::println);

    }

    /**
     * 业务层, 分页功能
     * @param pageNum 当前页码
     * @param pageSize 每页显示的最大数据量
     * @return
     */
    public PageInfo<Hero> findByPage (int pageNum, int pageSize) {
        // 1. 开启分页功能
        PageHelper.startPage(pageNum, pageSize);
        // 2. 执行自己的查询操作
        HeroDao mapper = session.getMapper(HeroDao.class);
        List<Hero> list = mapper.selectAll2();
        // 不要再此处对自己的查询结果做处理, 也不要再此处执行多个sql语句
        // 3. 把第2步查询的结果封装成 PageInfo 对象
        // 可以通过第2个参数, 设置 分页按钮导航的个数, 默认为8个
//        System.out.println("=====================================");
//        list.forEach(System.out::println);
//        System.out.println("=====================================");


        PageInfo<Hero> pageInfo = new PageInfo<>(list, 3);
        return pageInfo;
    }

    @Test
    public void h9() {
        int pageNum = 2;
        int pageSize = 2;
        // 1. 开启分页功能
        PageHelper.startPage(pageNum, pageSize);
        // 2. 执行自己的查询操作
        HeroTypeDao mapper = session.getMapper(HeroTypeDao.class);
        // 如果是一对多的连接查询操作, 则不能使用该分页工具, 因为查询到的数据不符合要求
//        List<HeroType> list = mapper.selectAll2();
        // 如果是一对多的查询操作, 则只能使用子查询的操作配置, 才能正常的使用 该分页工具
        List<HeroType> list = mapper.selectAll4();

        // 3. 把第2步查询的结果封装成 PageInfo 对象
        PageInfo<HeroType> pageInfo = new PageInfo<HeroType>(list);

        System.out.println("当前页码:" + pageInfo.getPageNum());
        System.out.println("上一页:" + pageInfo.getPrePage());
        System.out.println("下一页:" + pageInfo.getNextPage());
        System.out.println("总页数:" + pageInfo.getPages());
        System.out.println("总数据量:" + pageInfo.getTotal());

        // 当前页数据
        List<HeroType> heroTypes = pageInfo.getList();
        heroTypes.forEach(ht -> {
            System.out.println(ht);
            System.out.println("\tHeroes:" + ht.getHeroes());
        });

    }


}
